package com.codeduck.guava.basic;

import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
import com.google.common.base.Strings;

import java.util.Set;

/**
 * Using and avoiding null
 *
 * null 可能是不明确的，可能导致混淆的错误，有时仅仅是令人不快的。许多 Guava 实用程序拒绝并在 null 时迅速失败，而不是盲目地接受它们。
 * 参考地址：https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
 *
 * @author: <a href="mailto:codeduck@163.com">Codeduck</a>
 * @createDate: 2022-05-19
 */
public class Demo01 {
    public static void main(String[] args) {

        /**
         * 1. making an optional
         */
        Optional<Integer> possible = Optional.of(5);
        // Optional.fromNullable(5);

        /**
         * 2. query methods
         */

        // 如果此持有者包含（非空）实例, 返回true
        possible.isPresent(); // return true

        // 返回所包含的必须存在的 t 实例; 否则，将抛出一个 IllegalStateException。
        possible.get(); // return 5

        // 返回这个 Optional 中的当前值，如果没有，则返回指定的默认值。
        possible.or(-1); // return 5

        // 返回这个 Optional 中的当前值，如果没有，返回 null。
        possible.orNull(); // return 5

        // 返回一个包含在这个 Optional 中的实例的不可变单例集(如果有的话) ，或者返回一个空的不可变集。
        Set<Integer> integers = possible.asSet();
        integers.stream().forEach(System.out::println); // output 5

        /**
         * 3. Convenience methods
         */
        // 每当您希望用某个默认值替换空值时，请使用
        String second = MoreObjects.firstNonNull(null, "second");
        System.out.println(second); // output second

        // String 中提供了几个处理可能为 -null 的 String 值的方法:

        Strings.emptyToNull(""); // 如方法名称所示，将空字符串转为 null
        Strings.isNullOrEmpty(""); // 如方法名称所示，返回true
        Strings.nullToEmpty(null); // 如方法名称所示，将 null 转为空字符串

    }
}
